<?php
namespace ZyucMini\Core;

use ZyucMini\Core\View;
use ZyucMini\Core\Response;
use ZyucMini\Core\Request;

/**
 * 控制器基类 - 负责处理HTTP请求和响应
 * 提供统一的请求处理、响应输出和视图渲染功能
 * 
 * @package ZyucMini\Core
 * @author 黄凯
 */
abstract class Controller
{
    /** @var string 模板目录路径 */
    protected $templateDir = '';
    
    /** @var Request 请求对象 */
    protected $request;
    
    /** @var Response 响应对象 */
    protected $response;
    
    /** @var View 视图对象 */
    protected $view;

    /**
     * 构造函数 - 初始化控制器
     */
    public function __construct()
    {
        $this->request = new Request();
        $this->response = new Response();
        
        if (!empty($this->templateDir)) {
            $this->view = new View($this->templateDir);
        }
    }

    /**
     * 输出JSON响应
     * 
     * @param string $message 响应消息
     * @param array $data 响应数据
     * @param string $code 响应代码
     */
    public function json($message = 'ok', $data = null, $code = '000')
    {
        $res = ['msg' => $message, 'code' => $code];
        if ($data !== null) {
            $res['data'] = $data;
        }
        $this->response->setStatusCode(200)
            ->setHeader('X-Custom-Header', 'value')
            ->json($res);
    }

    /**
     * 输出成功JSON响应
     * 
     * @param array $data 响应数据
     */
    public function jsonOk($data = null)
    {
        $this->json('ok', $data, '000');
    }

    /**
     * 输出错误JSON响应
     * 
     * @param array $data 响应数据
     */
    public function jsonError($data = null)
    {
        $this->json('fail', $data, '001');
    }

    /**
     * 显示模板
     * 
     * @param string $template 模板名称
     * @param array $variables 模板变量
     */
    public function display($template, $variables = [])
    {
        $this->view->display($template, $variables);
    }

    /**
     * 分配模板变量
     * 
     * @param string $key 变量名
     * @param mixed $value 变量值
     */
    public function assign($key, $value = null)
    {
        $this->view->assign($key, $value);
    }

    /**
     * 显示模板并退出
     * 
     * @param string $template 模板名称
     */
    public function show($template)
    {
        echo $this->view->fetch($template);
        exit;
    }

    /**
     * 获取GET参数
     * 
     * @param string $key 参数名
     * @param mixed $default 默认值
     * @return mixed
     */
    public function get($key, $default = null)
    {
        return $this->request->get($key, $default);
    }

    /**
     * 获取POST参数
     * 
     * @param string $key 参数名
     * @param mixed $default 默认值
     * @return mixed
     */
    public function post($key, $default = null)
    {
        return $this->request->post($key, $default);
    }
}